package admin

import (
	"geekai/api/dto/request"
	"geekai/api/dto/response"
	"geekai/api/handler"
	"geekai/core"
	"geekai/core/types"
	"geekai/model"
	"geekai/utils"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"time"
)

// ProductHandler 产品模块
type ProductHandler struct {
	handler.BaseHandler
}

func NewProductHandler(app *core.AppServer, db *gorm.DB) *ProductHandler {
	return &ProductHandler{BaseHandler: handler.BaseHandler{App: app, DB: db}}
}

// SaveOrUpdate godoc
// @Summary      添加或者修改产品
// @Description  添加或者修改产品
// @Tags         后台管理-产品管理
// @Accept       json
// @Produce      json
// @Param        req   body     request.ProductSaveReq  true  "产品信息"
// @Success      200  {object}  types.BizVo{data=response.Product}
// @Router       /api/admin/product/saveOrUpdate [post]
// @Security AdminApiKeyAuth
func (h *ProductHandler) SaveOrUpdate(c *gin.Context) {
	var data request.ProductSaveReq
	if err := c.ShouldBindJSON(&data); err != nil {
		utils.ERROR(c, types.InvalidArgs)
		return
	}
	item := model.Product{
		Name:     data.Name,
		Price:    data.Price,
		Discount: data.Discount,
		Days:     data.Days,
		Power:    data.Power,
		Enabled:  data.Enabled,
	}
	item.Id = data.Id
	if item.Id > 0 {
		item.CreatedAt = time.Unix(data.CreatedAt, 0)
	}
	err := h.DB.Save(&item).Error
	if err != nil {
		utils.ERROR(c, "操作数据库出现错误："+err.Error())
		return
	}

	var itemResp response.Product
	err = utils.CopyObject(item, &itemResp)
	if err != nil {
		utils.ERROR(c, "数据拷贝失败："+err.Error())
		return
	}
	itemResp.Id = item.Id
	itemResp.UpdatedAt = item.UpdatedAt.Unix()
	utils.SUCCESS(c, itemResp)
}

// List godoc
// @Summary      查询产品列表
// @Description  查询产品列表
// @Tags         后台管理-产品管理
// @Accept       json
// @Produce      json
// @Success      200  {object}  types.BizVo{data=[]response.Product}
// @Router       /api/admin/product/list [get]
// @Security AdminApiKeyAuth
func (h *ProductHandler) List(c *gin.Context) {
	var items []model.Product
	var list = make([]response.Product, 0)
	res := h.DB.Order("sort_num ASC").Find(&items)
	if res.Error == nil {
		for _, item := range items {
			var product response.Product
			err := utils.CopyObject(item, &product)
			if err == nil {
				product.Id = item.Id
				product.CreatedAt = item.CreatedAt.Unix()
				product.UpdatedAt = item.UpdatedAt.Unix()
				list = append(list, product)
			} else {
				log.Error("拷贝数据失败：" + err.Error())
			}
		}
	}
	utils.SUCCESS(c, list)
}

// Enabled godoc
// @Summary      启用|禁用
// @Description  启用|禁用
// @Tags         后台管理-产品管理
// @Accept       json
// @Produce      json
// @Param        req   body     request.ProductEnabledReq  true  "启用禁用信息"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/product/enabled [post]
// @Security AdminApiKeyAuth
func (h *ProductHandler) Enabled(c *gin.Context) {
	var data request.ProductEnabledReq
	if err := c.ShouldBindJSON(&data); err != nil {
		utils.ERROR(c, types.InvalidArgs)
		return
	}
	err := h.DB.Model(&model.Product{}).Where("id", data.Id).Update("enabled", data.Enabled).Error
	if err != nil {
		utils.ERROR(c, "操作数据库失败："+err.Error())
		return
	}
	utils.SUCCESS(c)
}

// Sort godoc
// @Summary      对产品进行排序
// @Description  对产品进行排序
// @Tags         后台管理-产品管理
// @Accept       json
// @Produce      json
// @Param        req   body     request.ProductSortReq  true  "排序信息"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/product/sort [post]
// @Security AdminApiKeyAuth
func (h *ProductHandler) Sort(c *gin.Context) {
	var data request.ProductSortReq
	if err := c.ShouldBindJSON(&data); err != nil {
		utils.ERROR(c, types.InvalidArgs)
		return
	}
	for index, id := range data.Ids {
		err := h.DB.Model(&model.Product{}).Where("id", id).Update("sort_num", data.Sorts[index]).Error
		if err != nil {
			utils.ERROR(c, "操作数据库失败："+err.Error())
			return
		}
	}
	utils.SUCCESS(c)
}

// Remove godoc
// @Summary      删除产品
// @Description  删除产品
// @Tags         后台管理-产品管理
// @Accept       json
// @Produce      json
// @Param        id   query     int  true  "产品Id"
// @Success      200  {object}  types.BizVo{}
// @Router       /api/admin/product/remove [get]
// @Security AdminApiKeyAuth
func (h *ProductHandler) Remove(c *gin.Context) {
	id := h.GetInt(c, "id", 0)
	if id > 0 {
		err := h.DB.Where("id", id).Delete(&model.Product{}).Error
		if err != nil {
			utils.ERROR(c, "操作数据库失败："+err.Error())
			return
		}
	}
	utils.SUCCESS(c)
}
